// 《围棋》作者版权所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// Package plugin实现Go插件的加载和符号解析。
// 
// 插件是一个Go主程序包，包含导出的函数和变量，
// 已使用这些函数和变量构建：
// 
// Go build-buildmode=plugin 
// 
// 当插件第一次打开时，将调用所有程序中尚未包含
// 部分的包的初始函数。主功能未运行。
// 插件只初始化一次，不能关闭。
// 
// 目前，插件仅在Linux、FreeBSD和macOS上受支持。
// 请报告任何问题。
package plugin

// 插件是一个加载的Go插件。
type Plugin struct {
	pluginpath string
	err        string        // 设置插件加载失败
	loaded     chan struct{} // 加载时关闭
	syms       map[string]any
}

// 打开打开Go插件。
// 如果路径已经打开，则返回现有的*插件。
// 多个Goroutine同时使用是安全的。
func Open(path string) (*Plugin, error) {
	return open(path)
}

// 查找在插件p中搜索名为symName的符号。
// 符号是任何导出的变量或函数。
// 如果找不到符号，则会报告错误。
// 多个goroutine同时使用是安全的。
func (p *Plugin) Lookup(symName string) (Symbol, error) {
	return lookup(p, symName)
}

// 符号是指向变量或函数的指针。例如，定义为
// 
// package main 
// 
// import“fmt”
// 
// var V int 
// 
// func F（）{fmt.Printf（“您好，数字%d\n，V”）}
// 
// 可以访问
// 
// p，err:=插件。打开（“plugin_name.so”）
// if err！=无{
// panic（err）
// }
// /v，err:=p.Lookup（“v”）
// /if err无{
// panic（err）
// }
// f，err:=p.Lookup（“f”）
// /如果错误！=无{
// panic（err）
// }
// v.（*int）=7 
// f.（func（））（）
type Symbol any
